package com.interf.eyb;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class EybUtil {
	//-----------正式环境数据----------------------
	//把测试环境的IP和端口改成这个域名 https://my.ems.com.cn
	//ecCompanyId 1100037760735
	//秘钥 l6pamdh1w495p6k4
	// wh_code 35110108
	//mailType  SHUANGCHIKEJI
	//-----------------正式环境数据-----------------------
	public static String ecCompany = "1100037760735";// 测试环境 90000003465705
	public static String key = "l6pamdh1w495p6k4";// 测试环境 8nVV209U16ml9q63
	public static String path = "https://my.ems.com.cn"; // 测试环境 https://211.156.195.195:443
	public static String wh_code = "35110108";
	public static String mailType = "SHUANGCHIKEJI";
	public static String filePath = "E:/-V2.pdf";

	public static void main(String[] args) {
        /*String str = "<order></order>123456";
        try {
            System.out.println(CharUtil.encryptBASE64(CharUtil.encryptMD5(str.getBytes())));
        } catch (Exception e) {
            e.printStackTrace();
        }*/
		//orderDelivery();
		//getOrderFee();
		//electronicSurface();
		getConfigData();
	}

	/**
	 * 获取运单资费 重量信息
	 */
	public static void getOrderFee() {
		String url = path + "/pcpErp-web/a/pcp/orderFeeService/getOrderFee";
		String waybillNos = "LW903001353CN";
		String dataDigest = "";
		String ecCompanyId = ecCompany;

		try {
			String qmStr = waybillNos + key;
			dataDigest = CharUtil.encryptBASE64(CharUtil.encryptMD5(qmStr.getBytes()));// 消息签名
		} catch (Exception e) {
			e.printStackTrace();
		}

		Map<String, String> params = new HashMap<>();
		params.put("ecCompanyId", ecCompanyId);
		params.put("dataDigest", dataDigest);
		params.put("waybillNos", waybillNos);

		try {
			String result = HttpPost.https(url, params);
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 电子面单
	 */
	public static void electronicSurface() {
		String url = path + "/pcpErp-web/a/pcp/surface/download";
		String ecCompanyId = ecCompany;
		String dataDigest = "";//签名验证
		String barCode = "LW736654692CN";//要打印面单的条码，多个条码用逗号隔开，一次最多只能打印 50 个面单
		String version = "2.0";
		String pageType = "A4";

		try {
			String qmStr = barCode + key;
			dataDigest = CharUtil.encryptBASE64(CharUtil.encryptMD5(qmStr.getBytes()));// 消息签名
		} catch (Exception e) {
			e.printStackTrace();
		}

		Map<String, String> params = new HashMap<>();
		params.put("ecCompanyId", ecCompanyId);
		params.put("dataDigest", dataDigest);
		params.put("barCode", barCode);
		params.put("version", version);
		params.put("pageType", pageType);
		try {
			String result = HttpPost.https(url, params);
			System.out.println(result);
			JSONObject rJson = JSONObject.fromObject(result);

			if (rJson.getBoolean("success")) { // 成功获取面单
				String digestReturn = rJson.getString("digest").trim();
				// base64和md5算法见签名算法示例
				String digestLocal = CharUtil.encryptBASE64(CharUtil.encryptMD5((rJson.getString("data") + key).getBytes())).trim();
				System.out.println("digestReturn = " + digestReturn);
				System.out.println("digestLocal = " + digestLocal);
				if (!digestReturn.equals(digestLocal)) {
					System.out.println("签名校验失败");
				} else {
					byte[] pdfBytes = CharUtil.hexToByteArray(rJson.getString("data"));
					saveAsFile(pdfBytes);
				}
			} else {
				// 获取错误码
				String errCode = rJson.getString("err_code");
				// 获取错误描述信息
				String errMsg = rJson.getString("msg");
				System.out.println(errCode + " - " + errMsg);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		//version=2.0时，接收数字签名验证处理返回JSON信息（"success "为true，解析十六进制的 data 数据为字节数据，生成 PDF 文件；"success "为 false，根据错误码和错误信息进行相应的处理）；
	}

	/**
	 * 订单交运(返回运单号)接口
	 */
	public static void orderDelivery() {
		String url = path + "/pcpErp-web/a/pcp/orderService/OrderReceiveBack";

		JSONObject logistics_interface_json = new JSONObject();
		logistics_interface_json.put("created_time", dateFormat());//订单接入时间
		logistics_interface_json.put("sender_no", ecCompany);//协议客户代码  90000003465705测试环境数据
		logistics_interface_json.put("wh_code", wh_code);//用户揽收机构编号
		logistics_interface_json.put("mailType", mailType);//电商标识
		logistics_interface_json.put("logistics_order_no", "6xb5gh211");//物流订单号
		logistics_interface_json.put("batch_no", "12234");//批次号 不必填
		logistics_interface_json.put("biz_product_no", "001");//业务产品代码
		logistics_interface_json.put("weight", "10");//邮件重量(克)
		logistics_interface_json.put("volume", "10");//立方厘米 不必填
		logistics_interface_json.put("length", "10");//长 厘米 不必填
		logistics_interface_json.put("width", "10");//宽 厘米 不必填
		logistics_interface_json.put("height", "10");//高 厘米 不必填
		logistics_interface_json.put("postage_total", "123");//邮费 不必填
		logistics_interface_json.put("postage_currency", "USD");// 邮资币制 不必填
		logistics_interface_json.put("contents_total_weight", "11");// 内件总重量（内件单个重量*数量之和）
		logistics_interface_json.put("contents_total_value", "11");// 内件总价值 默认美元，单位：元（内件单个价值*数量之和）
		logistics_interface_json.put("transfer_type", "HK");//邮件交通方式 HK(航空),SLL(水陆路) 不必填
		logistics_interface_json.put("battery_flag", "0"); //是否有电池 0：无电池,1：有电池,不必填
		logistics_interface_json.put("pickup_notes", "");//备注 不必填
		logistics_interface_json.put("insurance_flag", "1");// 保险保价标志 1:基本 2:保价 3:保险 不必填
		logistics_interface_json.put("insurance_amount", "123");//保价保险金额 单位：元， 不必填
		logistics_interface_json.put("undelivery_option", "1");//邮件不能被投递时的策略 1-放弃，2-退回（默认，2-退回） 不必填
		logistics_interface_json.put("valuable_flag", "0");//贵品标识 贵品标识:0 无 1 有, 不必填
		logistics_interface_json.put("declare_source", "1");//申报信息来源(金关工程必填)
		logistics_interface_json.put("declare_type", "1");//申报类别 1:物品 2：货物(金关工程必填)
		logistics_interface_json.put("declare_curr_code", "USD");//申报币制代码 固定填 USD(金关工程必填)
		logistics_interface_json.put("printcode", "0");// 打印格式，不必填
		logistics_interface_json.put("barcode", "0323243245454");//自定义编号 不必填
		logistics_interface_json.put("forecastshut", "0");//预报关：0-无预报关信息 1-有预报关信息
		logistics_interface_json.put("mail_sign", "2");//9610 标识 1:是 2：否。目前填 2：否

		JSONObject sender = new JSONObject();//寄件人信息
		sender.put("name", "张三");//用户姓名
		sender.put("company", "IBM");//用户企业 不必填
		sender.put("post_code", "350311");//用户邮编 不必填
		sender.put("phone", "13030000000");//俄罗斯联邦邮件必填，收件人必填
		sender.put("mobile", "8613123458765");//俄罗斯联邦邮件必填，寄件人、收件人必选
		sender.put("email", "34456575844@qq.com");//不必填
		sender.put("id_type", "1");// 证件类型 不必填
		sender.put("id_no", "300000000000000000");// 证件号码，不必填
		sender.put("nation", "CN");//用户所在国家
		sender.put("province", "山东");//用户所在省（洲） 俄罗斯联邦邮件必填寄，收件人必选
		sender.put("city", "济南");//用户所在城市 俄罗斯联邦邮件必填寄，收件人必选
		sender.put("county", "历城");//用户所在县（区）俄罗斯联邦邮件必填寄，收件人必选
		sender.put("address", "xx路xx号");//用户详细地址
		sender.put("gis", "");// 不必填
		sender.put("linker", "张三");//用户联系人 俄罗斯联邦邮件必填 寄，收件人必选
		logistics_interface_json.put("sender", sender);

		JSONObject pickup = new JSONObject();// 发货人信息，不必填
		JSONObject receiver = new JSONObject();// 收货人信息
		receiver.put("name", "王五");//用户姓名
		receiver.put("company", "中国邮政");//用户企业 不必填
		receiver.put("post_code", "12345");//用户邮编 不必填
		receiver.put("phone", "13030000000");//俄罗斯联邦邮件必填，收件人必填
		receiver.put("mobile", "8613123458765");//俄罗斯联邦邮件必填，寄件人、收件人必选
		receiver.put("email", "34456575844@qq.com");//不必填
		receiver.put("id_type", "1");// 证件类型 不必填
		receiver.put("id_no", "300000000000000000");// 证件号码，不必填
		receiver.put("nation", "US");//用户所在国家
		receiver.put("province", "北京");//用户所在省（洲） 俄罗斯联邦邮件必填寄，收件人必选
		receiver.put("city", "北京");//用户所在城市 俄罗斯联邦邮件必填寄，收件人必选
		receiver.put("county", "西城区");//用户所在县（区）俄罗斯联邦邮件必填寄，收件人必选
		receiver.put("address", "xx路xx号");//用户详细地址
		receiver.put("gis", "");// 不必填
		receiver.put("linker", "王五");//用户联系人 俄罗斯联邦邮件必填 寄，收件人必选
		logistics_interface_json.put("receiver", receiver);

		JSONArray items = new JSONArray();
		JSONObject item = new JSONObject();
		item.put("cargo_no", "1234");// 商品 id
		item.put("cargo_name", "小米手机");// 商品名称（中文）
		item.put("cargo_name_en", "miphone");// 商品名称（英文）
		item.put("cargo_type_name", "手机");// 商品类型名称（中文）
		item.put("cargo_type_name_en", "mobilephone");// 商品类型名称（英文） 不必填
		item.put("cargo_origin_name", "CN");// 商品产地 默认CN 不必填
		item.put("cargo_link", "");// 商品销售连接 不必填
		item.put("cargo_quantity", 5);// 商品数量
		item.put("cargo_value", 2000);// 商品单价
		item.put("cost", 2000);// 申报价值,默认美元，申报价值可以和商品单价一样
		item.put("cargo_currency", "USD");// 商品申报币制,固定填 USD
		item.put("carogo_weight", 200);//商品重量 单位克
		item.put("cargo_description", "1");// 商品描述（内件成分）,国际邮件必填
		item.put("cargo_serial", "1");//商品序号（内件海关 HS商品编号） 不必填
		item.put("unit", "个");// 计量单位 默认个
		item.put("intemsize", "");//内件规格 不必填
		items.add(item);

		JSONObject item1 = new JSONObject();
		item1.put("cargo_no", "12345");// 商品 id
		item1.put("cargo_name", "魅族手机");// 商品名称（中文）
		item1.put("cargo_name_en", "miphone");// 商品名称（英文）
		item1.put("cargo_type_name", "手机");// 商品类型名称（中文）
		item1.put("cargo_type_name_en", "mobilephone");// 商品类型名称（英文） 不必填
		item1.put("cargo_origin_name", "CN");// 商品产地 默认CN 不必填
		item1.put("cargo_link", "");// 商品销售连接 不必填
		item1.put("cargo_quantity", 5);// 商品数量
		item1.put("cargo_value", 2000);// 商品单价
		item1.put("cost", 2000);// 申报价值,默认美元，申报价值可以和商品单价一样
		item1.put("cargo_currency", "USD");// 商品申报币制,固定填 USD
		item1.put("carogo_weight", 200);//商品重量 单位克
		item1.put("cargo_description", "1");// 商品描述（内件成分）,国际邮件必填
		item1.put("cargo_serial", "1");//商品序号（内件海关 HS商品编号） 不必填
		item1.put("unit", "个");// 计量单位 默认个
		item1.put("intemsize", "");//内件规格 不必填
		items.add(item1);

		logistics_interface_json.put("items", items);

		String msg_type = "B2C_TRADE";//消息类型
		String ecCompanyId = ecCompany; // 协议大客户号
		String data_type = "JSON";
		String logistics_interface = logistics_interface_json.toString();// 消息内容
		String data_digest = "";
		try {
			String qmStr = logistics_interface + key;
			data_digest = CharUtil.encryptBASE64(CharUtil.encryptMD5(qmStr.getBytes()));// 消息签名
		} catch (Exception e) {
			e.printStackTrace();
		}

		Map<String, String> params = new HashMap<>();
		params.put("msg_type", msg_type);
		params.put("ecCompanyId", ecCompanyId);
		params.put("data_type", data_type);
		params.put("logistics_interface", logistics_interface);
		params.put("data_digest", data_digest);
		try {
			String result = HttpPost.https(url, params);
			System.out.println(result);
			JSONObject rJson = JSONObject.fromObject(result);
			if (rJson.getBoolean("success")) {
				System.out.println(rJson.getString("waybillNo"));
			} else {
				System.out.println(rJson.getString("reason") + "---" + rJson.getString("msg"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 请求返回： {"success":"true","waybillNo":"LW903001353CN"}

	}

	/**
	 * 日期格式化
	 * @return
	 */
	public static String dateFormat() {
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//对日期进行格式化
		Date date = new Date();
		return df.format(date);
	}

	/**
	 * 获取配置数据（biz_product_no）
	 */
	public static void getConfigData() {
		Map<String, String> params = new HashMap<>();
		params.put("queryType", "queryBusinessType");
		try {
			String result = HttpPost.https(path + "/pcpErp-web/a/pcp/businessDataService/getBusinessData", params);
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//请求返回： {"data":[{"businessCode":"001","businessName":"e邮宝"},{"businessCode":"002","businessName":"航空挂小包"},{"businessCode":"003","businessName":"航空跟踪小包"},{"businessCode":"004","businessName":"航空平小包"},{"businessCode":"005","businessName":"e特快"},{"businessCode":"006","businessName":"国际EMS物品"},{"businessCode":"007","businessName":"中哈欧挂小包"},{"businessCode":"008","businessName":"铁路平小包（渝）"},{"businessCode":"009","businessName":"铁路挂小包（渝）"},{"businessCode":"010","businessName":"铁路跟踪小包（渝）"},{"businessCode":"011","businessName":"铁路平小包（义）"},{"businessCode":"012","businessName":"铁路挂小包（义）"},{"businessCode":"013","businessName":"铁路跟踪小包（义）"},{"businessCode":"014","businessName":"中俄公铁平小包"},{"businessCode":"015","businessName":"中俄公铁挂小包"},{"businessCode":"016","businessName":"国际EMS文件"},{"businessCode":"017","businessName":"国际EMS轻小件"},{"businessCode":"018","businessName":"e包裹"}]}
	}

	private static void saveAsFile(byte[] pdfBytes) throws IOException {
		FileOutputStream fos = null;
		try {
			File file = new File(filePath);
			fos = new FileOutputStream(file);
			fos.write(pdfBytes);
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} finally {
			fos.flush();
			fos.close();
		}
	}
}
